//TS高级类型
//1.交叉类型
function extend<T,U>(first:T,secound:U):T&U {
    // 将first和secound合并为一个对象
    let result:<T&U> = {};
    // 遍历first的属性
    for(let id in first) {
        // 将first的属性添加到result中
        (<T>result)[id] = first[id];
    }
    // 遍历secound的属性
    for(let id in secound) {
        // 将secound的属性添加到result中
        (<U>result)[id] = secound[id];
    }
    // 返回合并后的对象
    return result;

}
//联合类型
// 函数用于将字符串或数字转换为字符串，并在左侧填充0
function padleft(arg1: string | number):string | number {
    // 如果参数是数字，则将其转换为字符串，并在左侧填充0
    if(typeof arg1 === 'number') {
        return arg1.toString().padStart(2,'0');
    // 如果参数是字符串，则直接在左侧填充0
    }else {
        return arg1.padStart(2,'0');
    }
}
//类型别名
//可以将多个类型进行合并，并进行一个别名，使用对应别名的类型时，可以同时使用多个类型
type strOrnum = string | number;
let a:strOrnum = '123'; // true
let b:strOrnum = 123; // true
let c:strOrnum = true; // false
//类型索引
//keyof 类似与 Object.keys()，用于获取一个对象的所有键，并返回一个联合类型
interface Button {
    type: 'success' | 'warning' | 'danger';
    text: string;
}
type ButtonKeys = keyof Button; // 'type' | 'text'

//类型约束
//使用extends关键字，可以约束一个类型必须满足某个类型
type person = string | number;
function test<T extends person> (arg:T) {
    console.log(arg);
}